/*
    不定参宏函数的学习
*/

#include <stdio.h>

// // 使用宏函数, 这里宏函数就是简单的替换
// #define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);

// int main()
// {
//     // printf("%s:%d %s-%d\n", __FILE__, __LINE__, "比特就业课", 666);
//     LOG("%s-%d\n", "比特就业课", 666);

//     return 0;
// }


// 使用c语言中的不定参函数
#include <stdarg.h>
void printNum(int count, ...)  // 这里第一个参数是后面参数的个数
{
    va_list ap;
    va_start(ap, count);  // 获取指定参数的起始地址, 这里就是获取count参数之后的第一个参数的起始地址
    int i = 0; 
    while (i < count)
    {
        int num = va_arg(ap, int);  // 使用va_arg来获取参数, 这里就必须直到数据的类型, 这里全是int型
        printf("param[%d]: %d\n", i, num);
        i++;
    }
    va_end(ap); // 使用完之后把ap置空
}

#include <stdlib.h>
#define _GUN_SOURCE
void myprintf(const char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    char* res; 
    int ret = vasprintf(&res, fmt, ap);
    if (ret != -1)
    {
        printf(res);
        free(res);
    }
    va_end(ap);
}

int main()
{
    printNum(5, 512, 562, 8452, 69852, 3215);
    printNum(3, 0, 1 , 2);

    myprintf("%s-%d\n", "比特就业课", 566);
    myprintf("比特就业课\n");
}
